/* 
    模块里面可以写 ECMAScript的语法
    1. 变量
    2. 常量
    3. 函数
    4. 类

    都是私有的 相当于 块级作用域 {}

    我们可以把要给别人使用的成员暴露出去
    如何暴露？
        方式一：按需导出（按需暴露），单个暴露 exports
        方式二：整体导出，全部导出 module.exports

        上面的两种任何一种都可以，但是不能混合使用，他们是互斥的，如果一起使用的话（出现冲突），
        则以 module.exports 为准。
*/
let moduleName = 'm1';
let version = 'v1.0.0';
const PI = 3.14;

function add(a, b) {
    return a + b;
}

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    say() {
        console.log(`${this.name} say hello`);
    }
}


/* 方式一的暴露：
exports.moduleName暴露出去的名称（暴露的名称可以和暴露的成员的名称一致，也可以不一致），做到见名知意 = moduleName待暴露的成员;
*/
/* 暴露的名称和成员名称一致 */
exports.moduleName = moduleName;

/* 暴露的名称和成员不一致 */
exports.m1Version = version;

exports.add = add;

/* 如果想让外部使用 PI，要暴露 */
exports.PI = PI;